public class ComprehensivePolymorphismTest {
    public static void main(String[] args) {
        System.out.println("=== 接口多态演示 ===");
        // 使用接口类型引用不同实现类的对象
        Movable car = new Car("Toyota");
        Movable airplane = new Airplane("Boeing");
        
        car.move();       // 调用Car的move方法
        airplane.move();  // 调用Airplane的move方法
        
        // 使用数组展示接口多态
        Movable[] movables = {car, airplane};
        System.out.println("\n使用数组展示接口多态:");
        for (Movable movable : movables) {
            movable.move();  // 运行时决定调用哪个具体实现
        }
        
        System.out.println("\n=== 继承多态与接口多态的结合 ===");
        // 创建Animal数组，包含实现Movable接口的对象
        Animal[] animals = {
            new Dog("Buddy"),
            new Cat("Whiskers"),
            new Bird("Tweety")
        };
        
        // 如果动物也实现了Movable接口，可以这样处理
        Movable[] movers = {
            new Car("Honda"),
            new Airplane("Airbus")
        };
        
        // 演示统一处理
        System.out.println("处理可移动的对象:");
        processMovables(movers);
        
        System.out.println("\n处理动物对象:");
        processAnimals(animals);
        
        System.out.println("\n=== 多态的好处：代码可维护性和可扩展性 ===");
        // 添加新的实现类时，不需要修改现有代码
        Movable boat = new Movable() {
            @Override
            public void move() {
                System.out.println("Boat is sailing on the water");
            }
        };
        
        boat.move();
    }
    
    // 使用接口多态作为参数
    public static void processMovables(Movable[] movables) {
        for (Movable movable : movables) {
            movable.move();  // 调用具体实现的move方法
            
            // 调用默认方法
            movable.stop();
        }
    }
    
    // 使用继承多态作为参数
    public static void processAnimals(Animal[] animals) {
        for (Animal animal : animals) {
            animal.makeSound();  // 调用具体实现的makeSound方法
            animal.sleep();      // 调用通用方法
        }
    }
}